#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class Point{
public:
    Point(int x, int y)
    :_x(x)
    ,_y(y)
    {
        cout << "Point(int ,int)" << endl;
    }

    ~Point(){
        cout << "~Point()" << endl;
    }
    
    void print(){
        cout << "_x=" << _x << " _y=" << _y << endl;
    }

private:
    int _x;
    int _y;
};

void test(){
    vector<unique_ptr<Point>> arr;
    arr.push_back(unique_ptr<Point>(new Point(1,2)));
    arr.push_back(unique_ptr<Point>(new Point(3,4)));
    arr.push_back(unique_ptr<Point>(new Point(5,6)));
    arr.push_back(unique_ptr<Point>(new Point(7,8)));
    arr.push_back(unique_ptr<Point>(new Point(9,10)));

    for(auto & ptr : arr){
        ptr->print();
    }
}

void test1(){
    // unique_ptr不可以进行拷贝和赋值的操作
    // 创建一个vector里面存储的是unique_ptr
    vector<unique_ptr<int>> vec;
    unique_ptr<int > up(new int(10));
    //--vec.push_back(up);---
    // 这个写法是错误的
    // vector插入的对象会出现复制拷贝的情况
    // 此时我设置的vector的长度是0
    // 第一次插入会出现创建新的堆空间的创建
    // 会对传入的数据进行复制
    // 但是此时up是不可复制的数据
    // 此时vector反而不能存入左值
    // 但是可以放入右值数据
    vec.push_back(unique_ptr<int>(new int(10)));
    // 这中写法是允许的
    // 还可以使用std::move()函数
    // 把一个左值转换成一个右值
    // 这样也可以实现数据的插入
}
int main(int atgc, char * argv[])
{
    test1();
    return 0;
}

